package org.footballmanager.pandafootball.system.service.impl;

import org.footballmanager.pandafootball.common.BaseDao;
import org.footballmanager.pandafootball.common.annotation.SystemServiceLog;
import org.footballmanager.pandafootball.system.domain.CalculateEntity;
import org.footballmanager.pandafootball.system.domain.FootBfinfo;
import org.footballmanager.pandafootball.system.service.RepeatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;

/**
 * 服务抽象类
 * 用于抽象出一些已知的服务，如根据主键获取唯一记录、保存记录等方法
 * 继承此类可以省去 大部分重复代码
 *
 * @author chenjian
 * @since 2017年9月27日上午10:57:28
 */
public abstract class RepeatServiceImpl<T extends CalculateEntity> extends RepeatMainServiceImpl<T> implements RepeatService<T> {
    @Autowired
    BaseDao<T> baseDao;

    /**
     * 保存记录
     *
     * @param entity  参数
     * @param request 参数
     * @return 返回值
     */
    @Override
    @Transactional
    @SystemServiceLog(description = "保存记录")
    public int save(T entity, HttpServletRequest request) {
        /*根据胜平负球数算出:
		场次（带过来） = 报分次数
		胜平负相加 （带过来） = 场次
		进球（带过来）=所有报分里这个球队进球累加
		失球（带过来）=所有报分里这个球队失球累加
		净胜球 = 进球-失球
		胜率 = 胜 ÷ 场次
		积分 = 胜*3 + 平*1 + 负*0  */
        entity.setJsq(entity.getJq() - entity.getSq());
        if (entity.getBscc() != 0) {
            Double result = Double.parseDouble(entity.getS().toString()) / Double.parseDouble(entity.getBscc().toString());
            entity.setSl(result);
        }
        entity.setJf(entity.getS() * 3 + entity.getP());
        return super.save(entity, request);
    }

    @Override
    @Transactional
    @SystemServiceLog(description = "更新非空记录")
    public int updateNotNull(T entity, HttpServletRequest request) {
        entity.setJsq(entity.getJq() - entity.getSq());
        if (entity.getBscc() != 0) {
            double result = (double) entity.getS() / entity.getBscc();
            entity.setSl(result);
        }
        entity.setJf(entity.getS() * 3 + entity.getP());
        this.reComputeRanking(request);
        return super.updateNotNull(entity, request);
    }

    /**
     * 重新计算排名
     *
     * @param request 请求
     */
    @SystemServiceLog(description = "重新计算排名")
    public abstract void reComputeRanking(HttpServletRequest request);

    /**
     * 处理报分后续功能加分
     *
     * @param zhufc   主场球队
     * @param kefc    客场球队
     * @param bf      报分实体
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "处理报分后续功能加分")
    public void processAdd(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
        if (zhufc != null && kefc != null) {
            zhufc.setJq(zhufc.getJq() + bf.getJq1());
            zhufc.setSq(zhufc.getSq() + bf.getJq2());

            kefc.setJq(kefc.getJq() + bf.getJq2());
            kefc.setSq(kefc.getSq() + bf.getJq1());
        }
        super.processAdd(zhufc, kefc, bf, request);
    }

    /**
     * 处理报分后续功能减分
     *
     * @param zhufc   主场球队
     * @param kefc    客场球队
     * @param bf      报分实体
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "处理报分后续功能减分")
    public void processDelete(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
        if (zhufc != null && kefc != null) {
            zhufc.setJq(zhufc.getJq() - bf.getJq1());
            zhufc.setSq(zhufc.getSq() - bf.getJq2());

            kefc.setJq(kefc.getJq() - bf.getJq2());
            kefc.setSq(kefc.getSq() - bf.getJq1());
        }
        super.processDelete(zhufc, kefc, bf, request);
    }

}
